package gradle.mybatis.common.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.github.pagehelper.Page;
import gradle.common.core.enums.ResultCodeEnum;
import gradle.common.core.response.BaseResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 通用接口返回实体
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Schema(description = "通用接口返回实体带Page")
public class ApiResponse<T> extends BaseResponse {

    /**
     * 返回数据
     */
    @Schema(description = "返回数据")
    private T data;

    /**
     * 分页参数
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Schema(description = "分页参数")
    private Pager pager;

    /**
     * 私有无参构造器，防止new
     */
    private ApiResponse() {
    }

    /**
     * 私有带参构造器，防止new
     *
     * @param status  状态码
     * @param message 错误消息
     */
    private ApiResponse(int status, String message) {
        super(status, message);
    }

    /**
     * 使用枚举创建返回值
     *
     * @param resultCodeEnum 错误码枚举
     * @return api返回对象
     */
    private static <T> ApiResponse<T> getApiResponse(ResultCodeEnum resultCodeEnum) {
        return new ApiResponse<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage());
    }

    /**
     * 不带data的返回值
     *
     * @return api返回对象
     */
    public static <T> ApiResponse<T> success() {
        return getApiResponse(ResultCodeEnum.SUCCESS);
    }

    /**
     * 不带data的返回值
     *
     * @return api返回对象
     */
    public static <T> ApiResponse<T> success(int status, String message) {
        return new ApiResponse<>(status, message);
    }

    /**
     * 请求成功返回（不带分页参数）
     *
     * @param data 返回实体
     * @param <T>  返回实体类型
     * @return api返回对象
     */
    public static <T> ApiResponse<T> success(T data) {
        ApiResponse<T> apiResponse = success();
        apiResponse.setData(data);
        apiResponse.setMessage(SUCEESS_MESSAGE);

        return apiResponse;
    }

    /**
     * 请求成功（带分页参数）
     *
     * @param data 返回数据实体
     * @param page 分页数据
     * @param <T>  返回实体类型
     * @return api返回对象
     */
    public static <T> ApiResponse<T> success(T data, Page<T> page) {
        ApiResponse<T> apiResponse = success(data);
        apiResponse.setPager(Pager.convertPagerHelperPage(page));
        return apiResponse;
    }

    /**
     * 请求失败
     *
     * @param resultCodeEnum 异常请求枚举
     * @return 响应实体
     */
    public static <T> ApiResponse<T> error(ResultCodeEnum resultCodeEnum) {
        return getApiResponse(resultCodeEnum);
    }

    /**
     * 请求失败
     *
     * @param status  响应状态码
     * @param message 响应信息
     * @return 响应实体
     */
    public static <T> ApiResponse<T> error(int status, String message) {
        return new ApiResponse<>(status, message);
    }

}
